# 列表就是其他语言中的数组
# 创建列表的第一种方式
import itertools
import random
from functools import reduce
from operator import index

# lst = ['hello', 'world', 98]  # 可以放不同类型
# print(id(lst))
# print(type(lst))  # 打印<class 'list'>
# print(lst)  # 打印['hello', 'world', 98]

# 创建列表的第二种方式，使用内置函数list()
# lst2 = list(['hello', 'world', 98])
# print(lst2)  # 打印['hello', 'world', 98]

# ps：列表的5个特点
# 1.列表元素按顺序有序排序
# 2.索引映射唯一一个数据
# print(lst2[0], lst2[-3], lst2[2])  # 打印hello hello 98
# 3.列表可以存储重复数据
# 4.任意数据类型混存
# 5.根据需要动态分配和回收内存


# 获取指定元素的索引
# 如果列表中有相同的元素，只返回第一个相同元素索引
# lst3 = ['hello', 'world', 98, 'hello']
# print(lst3.index('hello'))  # 打印0
# print(lst3.index('python'))  # 如果list里面没有这个元素，索引就会报警告
# print(lst3.index('hello', 1, 3))  # 从1到3的位置找hello，这里是左闭右开，就是不包括3，所以找不到，会报警告


# 获取列表中的指定元素
# lst4 = ['hello', 'world', 98]
# print(lst4[2])  # 获取下标为2的元素

# 获取列表中的多个元素
# 语法：列表名[start:stop:step]
# lst5 = [0, 1, 2, 3, 4, 5, 6, 7]
# print(lst5[1:6:1])  # start1 stop6 step1这里仍然是左闭右开，所以只打印5个元素
# print(lst5[1:6])  # step不写 默认步长为1，打印结果同上
# print(lst5[:6:1])  # start不写 默认从下标0开始
# print(lst5[1::1])  # stop不写 默认打印到最后
# print(lst5[7:1:-1])  # 从下标7开始往前打印，左闭右开，所以只打印到2，1不会打印

# 判断指定元素在列表中是否存在 in 或not in
# print('p' in 'python')  # 打印True
# print('p' not in 'python')  # 打印False
# lst6 = [10, 20, 'hello']
# print(10 in lst6)  # True
# print(30 in lst6)  # False
# print('hello' in lst6)  # True

# 列表元素的增删改查

# 增
# 向列表末尾添加一个元素：append(增加的元素)
# lst7 = [1, 2, 3]
# print('添加元素前：', lst7, id(lst7))
# lst7.append(4)
# print('添加元素前：', lst7, id(lst7))  # id是一样的，说明列表对象仍然是之前那个
# 向列表末尾添加多个元素：extend()
# lst7.extend('hh')
# print(lst7)  # 打印[1, 2, 3, 4, 'h', 'h']
# 在列表任意位置添加元素：insert()
# lst7.insert(1, 100)  # 在下标1的位置添加100,原先下标1的元素往后移动
# print(lst7)  # 打印[1, 100, 2, 3, 4, 'h', 'h']

# 删
# 从列表中删除指定元素(如果有重复元素，只删除第一个)remove()
# lst8 = [1, 2, 3, 4, 2, 5, 6, 7, 8]
# lst8.remove(2)
# print(lst8)  # [1, 3, 4, 2, 5, 6, 7, 8]
# lst8.remove(10)#如果列表中元素不存在，你要remove就会报错

# 根据索引(下标)去移除元素pop()
# lst8.pop(0)
# print(lst8)  # [3, 4, 2, 5, 6, 7, 8]

# 切片: 表名[start:stop]
# lst8 = [1, 2, 3, 4, 5]
# new_lst = lst8[1:4]  # 从下标1切到下标4，左闭右开
# print(new_lst)  # 打印[2, 3, 4]
# print(lst8)  # [1, 2, 3, 4, 5]原先的lst8是不变的

# clear：清空所有元素
# lst8.clear()
# print(lst8)  # 打印[]
# 这时候lst8还是算做一个列表对象的，只是里面没有元素

# del:将列表对象删除
# del lst8
# print(lst8)#这个时候lst8已经不存在了，你再打印就会报警告


# 改
# lst9 = [1, 2, 3, 4]
# lst9[1] = 1  # 将下标1的元素改为1，和其他语言的数组元素赋值没什么区别
# print(lst9)  # [1,1,3,4]

# 列表的排序操作
# sort():默认是升序，可以指定reverse=True，实现降序
# lst10 = [1, 323, 3, 5, 7, 2, 1, 0]
# print('排序前：', lst10)
# lst10.sort()
# print('升序排序后：', lst10)
# lst10.sort(reverse=True)
# print('降序排序后：', lst10)
# print(lst10)  # lst10原有的顺序被改变了
# print('======分割线======')
# 内置函数sorted(),不会改变要排序列表的原有顺序,其他用法和sort一样
# 因为不改变原有顺序，那肯定是返回一个新列表了，你要用一个新列表接收一下
# 内置函数类似于java的静态方法，直接使用即可
# lst10 = [1, 323, 3, 5, 7, 2, 1, 0]
# print('排序前：', lst10)
# new_lst = sorted(lst10)
# print('升序排序后：', new_lst)
# new_lst = sorted(lst10, reverse=True)
# print('降序排序后：', new_lst)
# print(lst10)  # lst10原有的顺序被改变了
#
# s1 = [4, 5, 6]
# s2 = s1
# s1[1] = 0
# print(s2)

# 列表生成式
#语法：列表元素的表达式 for 自定义变量 in range(x,y)
#例：
# list=[i for i in range(1,10)]
# print(list)#打印[1,2,3,4,5,6,7,8,9]
#
# list=[2*i for i in range(1,10)]
# print(list)#打印[2,4,6,8,10,12,14,16,18]

#计算1+2+4+8+16+....(共20项)
#一般写法：
# sum = 0
# j = 1
# for i in range(1, 21):
#     sum += j
#     j *= 2
# print(sum)#打印1048575

#计算1+2+4+8+16+....(共20项)
#列表生成式写法：
# sum=0
# x=[]
# x=[2**i for i in range(0,20)]
# for i in x:
#     sum+=i
# print(sum)#1048575

#课后习题
#生成一个2n+1的数字列表，n为从1到10的数字
# x=[2*n+1 for n in range(1,11)]
# print(x)

#过滤出一个指定的数字列表中值大于30的元素，L = [3,7,11,14,19,33,26, 57,99]；
# L = [3,7,11,14,19,33,26, 57,99]
# for i in L:
#     if(i>30):
#         print(i)

#用一个列表的所有单词的首字母生成一个集合：words_list=['tensorflow', 'torch', 'caffe', 'mxnet', 'keras'] 。
# x=[]
# words_list=['tensorflow', 'torch', 'caffe', 'mxnet', 'keras']
# for i in words_list:
#     x.append(i[0])
# print(x)

#计算两个列表的全排列组合,并将结果保存到一个新列表中
# L1=['香蕉','苹果','橙子']
# L2=['可乐','牛奶']
#
# L3=list(itertools.product(L1,L2))
# print(L3)

#随机生成20个数字，然后去除重复的数字
L=[]
for i in range(1,20):
    L.append(random.randint(1,10))#1-10表示只能生成1-10之间的数
print("去重前生成的20个随机数为：",L)
L1=list(set(L))
print("去重后生成的20个随机数为：",L1)
